package qqclient.service;

import qqcommon.Message;
import qqcommon.MessageType;
import qqcommon.User;
import utils.Utility;

import java.io.*;
import java.net.InetAddress;
import java.net.Socket;

//用户在客户端涉及到的服务
public class UserClientService {

    //    当前服务持有socket和user属性，便于在其他服务中使用
    private Socket socket;
    private User user;

    //构造器
    public UserClientService() {

    }

    /**
     * 客户端退出，给服务端发送信息，释放资源
     */
    public void logout() {
        try {
            Message message = new Message();//创建信息对象
            message.setMesType(MessageType.MESSAGE_CLIENT_EXIT);//设置信息类型为客户端退出
            message.setSender(user.getId());//设置发送者
//            根据当前服务对应socket向服务端传输数据包
            ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
            oos.writeObject(message);
//            从客户端线程集合移除当前用户对应的线程
            ManageClientConnectThread.removeClientConnectThread(user.getId());
            System.out.println(user.getId() + "在客户端退出");
            System.exit(0);//进程结束指令，将会导致当前客户端运行的线程结束
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取在线用户列表，客户端向服务端发送数据包
     */
    public void getOnlineUsers() {
        try {
            Message message = new Message();//创建信息对象
            message.setMesType(MessageType.MESSAGE_GET_ONLINE_FRIEND);//设置信息类型为客户端获取在线用户列表
            message.setSender(user.getId());//设置发送者
//            根据当前服务对应socket向服务端传输数据包
            ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
            oos.writeObject(message);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    /**
     * 当前用户向服务端发送群聊消息
     */
    public void sendAllMessage() {
        System.out.println("请输入你要群发的消息：");
        String allMes = Utility.readString(100);
        try {
            Message message = new Message();//创建信息对象
            message.setMesType(MessageType.MESSAGE_TO_ALL_MES);//设置信息类型为客户端获取在线用户列表
            message.setSender(user.getId());//设置发送者
            message.setContent(allMes);//设置群聊消息的内容
//            根据当前服务对应socket向服务端传输数据包
            ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
            oos.writeObject(message);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    /**
     * 当前用户向服务端发送私聊消息
     */
    public void sendOneMessage() {
        System.out.print("请输入你要私聊的对象：");
        String receiver = Utility.readString(50);
        System.out.print("请输入私聊的内容：");
        String content = Utility.readString(100);
        try {
            Message message = new Message();//创建信息对象
            message.setMesType(MessageType.MESSAGE_TO_ONE_MES);//设置信息类型为客户端获取在线用户列表
            message.setSender(user.getId());//设置发送者
            message.setReceiver(receiver);//设置接收者
            message.setContent(content);//设置私聊消息的内容
//            根据当前服务对应socket向服务端传输数据包
            ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
            oos.writeObject(message);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 当前用户向服务端发送私聊消息
     */
    public void sendFileToOne() {
        System.out.print("请输入你发送文件的对象：");
        String receiver = Utility.readString(50);
        System.out.print("请输入发送文件的源路径：");
        String fileSrcPath = Utility.readString(100);
        System.out.print("请输入发送文件的目标路径：");
        String fileDesPath = Utility.readString(100);
        File file = new File(fileSrcPath);
        if (!file.exists()) {
            System.out.println("文件不存在");
            return;
        }

        try {
            byte[] bytes = new byte[(int) file.length()];
            FileInputStream fis = new FileInputStream(file);
            int fileSize = fis.read(bytes);//将文件内容读取到字节数组中，并获取文件字节数
            String fileName = fileSrcPath.substring(fileSrcPath.lastIndexOf("\\") + 1);

            Message message = new Message();//创建信息对象
            message.setFileSize(fileSize);//设置文件大小
            message.setFileSrc(fileSrcPath);//设置文件源路径
            message.setFileDes(fileDesPath);//设置文件目标路径
            message.setFileContent(bytes);//设置文件字节内容
            message.setFileName(fileName);//设置文件名


            message.setMesType(MessageType.MESSAGE_FILE_TO_ONE_MES);//设置信息类型为客户端发送文件
            message.setSender(user.getId());//设置发送者
            message.setReceiver(receiver);//设置接收者

//            根据当前服务对应socket向服务端传输数据包
            ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
            oos.writeObject(message);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }


    /**
     * 用户登录校验，与服务端建立socket，获取服务端的校验结果
     *
     * @param userid
     * @param userpsw
     * @return
     */
    public boolean login(String userid, String userpsw) {
//         创建登录用的用户对象
        user = new User(userid, userpsw);
//         创建socket对象，第一次与服务端通信，传user去后端校验,可以指定通讯后端ip地址
        try {
            socket = new Socket(InetAddress.getByName("127.0.0.1"), 9999);

//          创建对象流
            ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
//          传输登录对象到服务端校验
            oos.writeObject(user);

//          接受后端的校验反馈
            ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
            Message message = (Message) ois.readObject();

//          根据校验结果判断是否登录成功
            if (MessageType.MESSAGE_LOGIN_SUCCESS.equals(message.getMesType())) {//登录成功
//               创建客户端线程，用ConcurrentHashMap<String, ClientConnectThread>进行管理
                ClientConnectThread clientConnectThread = new ClientConnectThread(socket);
                //开启客户端线程
                clientConnectThread.start();
                //线程添加到集合中进行管理
                ManageClientConnectThread.addClientConnectThread(userid, clientConnectThread);
                return true;//返回登录成功
            } else {
                socket.close();
                return false;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;//返回登录失败
    }


}
